package com.jvm.reentrantlockp;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

// ReentrantLock 锁申请等待限时
// tryLock() 有参方法会等待超时时间后返回

/**
 * 该方法在指定的时间内不管是否可以获取锁，都会返回结果，
 * 返回 true，表示获取锁成功，返回 false 表示获取失败。
 * 此方法有 2 个参数，第一个参数是时间类型，是一个枚举，可以表示时、分、秒、毫秒等待，
 * 使用比较方便，第 1 个参数表示在时间类型上的时间长短。此方法在执行的过程中，
 * 如果调用了线程的中断 interrupt()方法，会触发 InterruptedException 异常。
 */
public class Demo7 {
    private static ReentrantLock lock1 = new ReentrantLock(false);

    public static class T extends Thread {

        public T(String name) {
            super(name);
        }

        @Override
        public void run() {
            try {
                System.out.println(System.currentTimeMillis() + ":" +
                        this.getName() + " 开始获取锁！");
                // tryLock()是立即响应的，中间不会有阻塞。
                if (lock1.tryLock(3, TimeUnit.SECONDS)) {
                    System.out.println(System.currentTimeMillis() + ":" +
                            this.getName() + "获取到了锁！");
                    // 获取锁之后，休眠5秒
                    TimeUnit.SECONDS.sleep(5);
                } else {
                    System.out.println(System.currentTimeMillis() + ":" +
                            this.getName() + "未能获取到锁！");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("中断标志：" + this.isInterrupted());
            } finally {
                if (lock1.isHeldByCurrentThread()) {
                    lock1.unlock();
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {

        /**
         *
         * jps
         * jstack 进程id       查看
         *
         */
        T t1 = new T("t1");
        T t2 = new T("t2");

        t1.start();
        t2.start();

    }
}
